/*
File类专门用于表示一个文件或文件夹，只不过它还是代表这个文件，并不是这个文件本身。
通过File对象，可以更好的管理和操作磁盘上的文件
 */
package javaio.FileClass;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        //通过File对象，我们可以快速获取文件的所有信息
        File file = new File("test.txt"); //可以是相对目录或绝对目录，相对是从项目路径开始的，文件不存在时创建
        System.out.println(file.exists());  //布尔值
        System.out.println(file.length());  //文件的大小，单位是字节
        System.out.println(file.isDirectory());
        System.out.println(file.canExecute());
        System.out.println(file.canRead());
        System.out.println(file.canWrite());
        System.out.println(file.getAbsolutePath()); //获取文件绝对路径

        //如果是文件夹，可以获取文件夹内的文件列表等
        File file2 = new File(".idea/");
        System.out.println(Arrays.toString(file2.list()));  //快速获取文件夹下文件名
        //直接打印file.list()为null，idea提示我们使用java.util.Arrays.toString().转换为String

        System.out.println(Arrays.toString(file2.listFiles()));  //打印文件名带上文件夹名

        //还可以循环打印文件夹下所有文件的绝对路径
        for (File f : file2.listFiles()) {  //从文件列表里所有子文件的File对象
            System.out.println(f.getAbsolutePath());

        }

        //如果希望读取某个文件的内容，可以直接将File对象作为参数传进字节流或字符流
        File file3 = new File("test.txt");
        try(FileInputStream inputStream = new FileInputStream(file3)){
            System.out.println((char) inputStream.read());

        }catch (IOException e){
            e.printStackTrace();
        }

        //File对象可以创建目录
        File file4 = new File(".idea/aa/bb/cc"); //创建file4对象指向一个不存在的目录
        file4.mkdir(); //mkdir只能在已存在的目录下创建一层目录，这里最终目录是cc，但aa不存在，创建不成功
        file4.mkdirs(); //可以递归创建目录，每层不存在的都会创建，类似于linux的mkdir -P

        //File文件删除
        file4.delete(); //删除文件，是目录时删除最后一层目录，这里的效果是把cc文件件删掉了

        //尝试把一个文件夹下所有文件拷贝到另一个目录，把.idea目录下所有文件拷贝到
        //使用File对象拷贝文件，本质上和字节流拷贝文件相同，只是操作对象换成了File对象。
        File old = new File(".idea/");
        File target  = new File("new/");
        target.mkdirs();  //创建目标文件夹
        for (File f: old.listFiles()) {
            try(FileInputStream inputStream = new FileInputStream(f);
                FileOutputStream outputStream = new FileOutputStream(target+"/"+f.getName())){
                byte[] bytes = new byte[10];
                //这里可以用inputStream.available()来申请数组大小，但源文件太大防止数组太长，改为固定小长度
                int tmp;
                while((tmp = inputStream.read(bytes)) != -1){
                    outputStream.write(bytes,0,tmp);
                }

            }catch (IOException e){
                e.printStackTrace();
            }
        }
        //执行完发现.idea目录下文件夹没有拷贝，想要拷贝文件夹，设置一个方法判断是文件夹还是文件，是文件就拷贝过去，是文件夹就递归调用自己



    }
}
